package chapter3.lessons.copyPart;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @Project ：learn_java
 * @File ：CopyDemo02.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/2/28 20:13
 * @Description ：读取文件中的数据打印到控制台
 */

public class CopyDemo02 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("IOTestOutputFiles\\fileExample.txt");
        byte[] bytes = new byte[1024];
        int len;
        /*
        豆包生成的解释：

        ### 代码执行流程
        当文件大小超过 1024 字节时，`while` 循环会多次执行，每次执行的过程如下：
        1. **读取字节**：`fis.read(bytes)` 尝试从文件中读取字节并填充到 `bytes` 数组中。每次最多读取 1024 个字节（因为 `bytes` 数组的长度为 1024）。
        2. **判断读取结果**：`fis.read(bytes)` 会返回实际读取的字节数，将其赋值给 `len`。如果 `len` 不等于 -1，说明还没有到达文件末尾，继续执行循环体。
        3. **输出内容**：在循环体中，`new String(bytes, 0, len)` 将 `bytes` 数组中从索引 0 开始、长度为 `len` 的字节转换为字符串，并通过 `System.out.println` 输出。
        4. **继续循环**：循环继续，再次调用 `fis.read(bytes)` 从文件中读取接下来的字节，填充到 `bytes` 数组中（覆盖之前存储的内容），重复上述步骤，直到文件末尾（`fis.read(bytes)` 返回 -1）。

        ### 示例说明
        假设文件 `fileExample.txt` 有 2500 字节，`while` 循环的执行过程如下：
        - **第一次循环**：
            - `fis.read(bytes)` 读取前 1024 个字节到 `bytes` 数组中，`len` 的值为 1024。
            - `new String(bytes, 0, len)` 将这 1024 个字节转换为字符串并输出。
        - **第二次循环**：
            - `fis.read(bytes)` 读取接下来的 1024 个字节，覆盖 `bytes` 数组中的原有内容，`len` 的值还是 1024。
            - `new String(bytes, 0, len)` 将新读取的 1024 个字节转换为字符串并输出。
        - **第三次循环**：
            - `fis.read(bytes)` 读取剩余的 452 个字节（2500 - 1024 - 1024 = 452）到 `bytes` 数组中，`len` 的值为 452。
            - `new String(bytes, 0, len)` 将这 452 个字节转换为字符串并输出。
        - **循环结束**：再次调用 `fis.read(bytes)` 时，由于已经到达文件末尾，返回 -1，`while` 循环终止。

        ### 关于“刷新”
        这里说的“刷新”并不是严格意义上的刷新操作。实际上，每次调用 `fis.read(bytes)` 时，会将新读取的字节覆盖 `bytes` 数组中之前存储的内容。所以可以理解为在每次读取新的字节时，`bytes` 数组中的数据被更新了。

        综上所述，当文件大小超过 1024 字节时，`while` 循环会多次执行，每次将读取到的字节输出，然后继续读取后续的字节，直到文件读取完毕。
        * */
        while ((len = fis.read(bytes)) != -1) {
            System.out.println("len: " + len);
            for (byte b : bytes) {
                System.out.print(b);
            }
            System.out.println(new String(bytes, 0, len));
        }
        fis.close();
    }
}
